package jv.redis.datatype.sortcommand;

import java.util.HashMap;
import java.util.Map;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;

public class RedisSort {
	Jedis jedis;
	@Before
	public void initRedis(){
		jedis = new Jedis("redis://192.168.1.108:6379");
	}
	
	@After
	public void closeRedis(){
		//注意不要使用jedis.shutdown()，这样会把服务器停掉。。。
		jedis.close();
	}
	//因为sort命令复杂度，jedis在实现的时候使用了SortingParams类实现其各种可变选项，用代码着重讲一下
	public void initData(){
		Long personId;
		String rPersonId;
		Map<String,String> personMap = new HashMap<String,String>();
		//为了测试方便，在每次程序启动的时候都把之前的元素删除，在实际编程中谨慎使用
		jedis.del("person:id");
		jedis.del("person:id:seq");
		
		//添加第一个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "lucy");
		personMap.put("sex","female");
		personMap.put("age","23");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
		
		//添加第二个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "hary");
		personMap.put("sex","male");
		personMap.put("age","25");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
		
		//添加第三个人
		personId = jedis.incr("person:id:seq");
		rPersonId = "person:"+personId.toString();
		jedis.lpush("person:id", personId.toString());
		personMap.put("name", "volk");
		personMap.put("sex","male");
		personMap.put("age","24");
		jedis.hmset(rPersonId,personMap);
		personMap.clear();
	}
	@Test
	public void sortOptions(){
		initData();
		//对一个列表进行排序
		System.out.println(jedis.sort("person:id"));
		//根据每个人的年龄进行排序
		//下面的代码等于redis中这一命令行：sort person:id by person:*->age desc
		SortingParams sp = new SortingParams();
		sp.desc();
		sp.by("person:*->age");
		System.out.println(jedis.sort("person:id", sp));
		
		//根据每个人的年龄进行排序，返回每个人的所有属性，包括ID
		sp = new SortingParams();
		sp.desc();
		sp.by("person:*->age");
		sp.get("person:*->name","person:*->sex","person:*->age","#");
		System.out.println(jedis.sort("person:id", sp));
		
		//根据每个人的年龄进行排序，返回每个人的所有属性，包括ID,并将最终结果存储到key=person:temp:rlt中
		jedis.sort("person:id", sp,"person:temp:rlt");
		System.out.println("person:temp:rlt="+jedis.lrange("person:temp:rlt", 0, -1));
	}
}
